package com.edu.util;

import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.apache.commons.logging.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * 文件帮助类
 * @author Administrator
 *
 */
public class FileHelper {
	  private static final String TAG = "FileHelp";
	 
	  public static final String JPG = ".jpg";
	  public static final String PNG = ".png";
	 
	  public static final String MP3 = ".mp3";
	  public static final String MP4 = ".mp4";
	  public static final String APK = ".apk";
	 
	  private final static Logger logger = LoggerFactory.getLogger(FileHelper.class);
	 
	  /**
	   * txt文本
	   */
	  public static int ISTXT = 0;
	 
	  private static String TXT = ".txt";
	 
	  /**
	   * 文件删除
	   */
	  public static boolean deletfile(File file) {
	    if (file.isDirectory()) {
	      if (file.listFiles().length > 0) {
	        for (File i : file.listFiles()) {
	          deletfile(i);
	        }
	      } else {
	        file.delete();
	      }
	    } else {
	      file.delete();
	    }
	    file.delete();
	    return true;
	  }
	 
	  /**
	   * 新建文件夹
	   * 返回true 文件创建成功
	   * 返回false 文件创建失败 ->文件存在
	   * 返回true 文件创建成功,返回false 文件创建失败 (文件存在、权限不够）
	   */
	  public static boolean creatFile(String filename, String path) {
	    File file = new File(path + File.separator + filename);
	    if (file.exists()) {
	      return false;
	    } else {
	      file.mkdir();
	      return true;
	    }
	  }
	 
	  /**
	   * 创建自定义文件类型文件
	   * 随意为文件夹
	   * 0 txt文本
	   *
	   * @return boolean
	   * 返回true 文件创建成功,返回false 文件创建失败 (文件存在、权限不够）
	   * *
	   */
	  public static boolean creatFile(String filename, String path, int type) {
	    String ptr = path + File.separator + filename;
	    File file;
	    switch (type) {
	      case 0:
	        file = new File(ptr + TXT);
	        break;
	      default:
	        file = new File(ptr);
	        break;
	    }
	    if (file.exists()) {
	      return false;
	    } else {
	      try {
	        file.createNewFile();
	        return true;
	      } catch (IOException e) {
	        return false;
	      }
	    }
	  }
	 
	 
	  /**
	   * 文件重名
	   *
	   * @param name 新创建的文件名
	   * @param file 创建文件的地方
	   */
	  public static boolean reName(String name, File file) {
		
	    String pathStr = file.getParent() + File.separator + name;
	    System.out.println(pathStr);
	    
	    return file.renameTo(new File(pathStr));
	  }
	 
	  /**
	   * 文件复制
	   *
	   * @param oldFile  要被复制的文件
	   * @param toNewPath 复制到的地方
	   * @return boolean trun 复制成功，false 复制失败
	   * *
	   */
	  public static boolean copeyFile(File oldFile, String toNewPath) {
	    String newfilepath = toNewPath + File.separator + oldFile.getName();
	 
	    File temp = new File(newfilepath);
	    //判断复制到的文件路径是否存在相对文件，如果存在，停止该操作
	    if (temp.exists()) {
	      return false;
	    }
	    //判断复制的文件类型是否是文件夹
	    if (oldFile.isDirectory()) {
	      temp.mkdir();
	      for (File i : oldFile.listFiles()) {
	        copeyFile(i, temp.getPath());
	      }
	    } else {
	      //如果是文件，则进行管道复制
	      try {
	        //从文件流中创建管道
	        FileInputStream fis = new FileInputStream(oldFile);
	        FileChannel creatChannel = fis.getChannel();
	        //在文件输出目标创建管道
	        FileOutputStream fos = new FileOutputStream(newfilepath);
	        FileChannel getChannel = fos.getChannel();
	        //进行文件复制（管道对接）
	        getChannel.transferFrom(creatChannel, 0, creatChannel.size());
	 
	        getChannel.close();
	        creatChannel.close();
	        fos.flush();
	        fos.close();
	        fis.close();
	      } catch (Exception e) {
	        logger.info(TAG, "copey defeated,mebey file was existed");
	        e.printStackTrace();
	        return false;
	      }
	    }
	    return true;
	  }
	 
	  /**
	   * 文件剪切
	   *
	   * @param oldFile   要被剪切的文件
	   * @param newFilePath 剪切到的地方
	   * @return boolean trun 剪切成功，false 剪切失败
	   */
	  public static boolean cutFile(File oldFile, String newFilePath) {
	    if (copeyFile(oldFile, newFilePath)) {
	      oldFile.delete();
	      return true;
	    } else {
	      return false;
	    }
	  }
	 
	 
	  /**
	   * 获取对应文件类型的问件集
	   *
	   * @param dir 文件夹
	   * @param type 文件类型，格式".xxx"
	   * @return List<file> 文件集合
	   */
	  public static List<File> getTheTypeFile(File dir, String type) {
	    List<File> files = new ArrayList<File>();
	    for (File i : dir.listFiles()) {
	      String filesTyepe = getFileType(i);
	      if (type.equals(filesTyepe)) {
	        files.add(i);
	      }
	    }
	    return files;
	  }
	 
	  /**
	   * 获取文件类型
	   *
	   * @param file 需要验证的文件
	   * @return String 文件类型
	   * 如:
	   * 传入文件名为“test.txt”的文件
	   * 返回 .txt
	   * *
	   */
	  public static String getFileType(File file) {
	    String fileName = file.getName();
	    if (fileName.contains(".")) {
	 
	      String fileType = fileName.substring(fileName.lastIndexOf("."),
	          fileName.length());
	      return fileType;
	    } else {
	      return null;
	    }
	  }
	 
	 
	  /**
	   * 获取文件最后操作时间类
	   *
	   * @param file 需要查询的文件类
	   * @return “yy/MM/dd HH:mm:ss”的数据字符串
	   * 如：
	   * 14/07/01 01:02:03
	   */
	  public static String getCreatTime(File file) {
	    long time = file.lastModified();
	    Calendar calendar = Calendar.getInstance();
	    SimpleDateFormat dateFormat = new SimpleDateFormat("yy/MM/dd HH:mm:ss");
	    String date = dateFormat.format(calendar.getTime());
	    return date;
	  }
	 
	  

	 
	}